package uiMain;
//Hola

import gestorbienraizok.inmuebles.Apartamento;
import gestorbienraizok.inmuebles.Banho;
import gestorbienraizok.inmuebles.Casa;
import gestorbienraizok.inmuebles.Garaje;
import gestorbienraizok.inmuebles.Inmueble;
import gestorbienraizok.inmuebles.Pieza;
import gestorbienraizok.inmuebles.Unidad;
import gestorbienraizok.usuarios.Persona;
import gestorbienraizok.inmuebles.Torre;
import java.util.LinkedList;
import static gestorbienraizok.inmuebles.Inmueble.buscarInmueble;
import gestorbienraizok.inmuebles.ServiciosAdicionales;
import gestorbienraizok.usuarios.ClienteOferente;
import java.util.Scanner;
import static uiMain.bienRaizOk.*;

public class OpcionRegistrarUnInmueble extends OpcionDeMenu {

    private String nombreParaMostrar = " Registrar una propiedad";

    @Override
    public void ejecutar() {
        System.out.print("Ingrese la cédula del propietario de la propiedad: ");
        long cedula = entrada.nextLong();
        while (cedula < 0) {
            System.out.print("Ingrese una cédula válida: ");
            cedula = entrada.nextLong();
        }
        Unidad estaUnidad;
        Torre estaTorre;
        ClienteOferente esteClienteOferente = elClienteEstaRegistradoComoOferente(cedula);
        if (esteClienteOferente == null) {
            System.out.println("No se encuentra registrado ningún cliente oferente con cédula " + cedula);
            return;
        } else {
            System.out.print("Ingrese el código de la unidad a la que pertenece la propiedad: ");
            int codigo = entrada.nextInt();
            estaUnidad = buscarUnidad(codigo);
            if (estaUnidad == null) {
                System.out.println("La unidad no está en el sistema. Se procederá a registrarla");
                System.out.println("El código que ingresó será el de esta nueva unidad.");
                System.out.print("Ingrese el nombre de esta unidad: ");
                entrada =  new Scanner(System.in);
                String nombre = entrada.nextLine();
                System.out.print("Ingrese la dirección: ");
                entrada = new Scanner(System.in);
                String direccion = entrada.nextLine();
                System.out.print("Ingrese el estrato (1-6): ");
                byte estrato = entrada.nextByte();
                while (estrato < 1 || estrato > 6) {
                    System.out.print("Ingrese un estrato válido (1-6): ");
                    estrato = entrada.nextByte();
                }

                boolean cerrada = verificarCaracteristica("¿La unidad es cerrada? (S/N): ", "s", "n");

                boolean tieneServiciosAdicionales = false;
                boolean piscina;
                boolean gimnasio;
                boolean zonasVerdes;
                boolean salonSocial;
                boolean parque;
                boolean vigilancia;
                boolean servicioDeAseo;

                if (cerrada) {
                    tieneServiciosAdicionales = verificarCaracteristica("¿Esta unidad cuenta con servicios adicionales? (S/N): ", "s", "n");
                }

                ServiciosAdicionales serviciosAdicionales = null;
                if (tieneServiciosAdicionales) {

                    piscina = verificarCaracteristica("¿La unidad tiene piscina? (S/N): ", "s", "n");
                    gimnasio = verificarCaracteristica("¿La unidad tiene gimnasio? (S/N): ", "s", "n");
                    zonasVerdes = verificarCaracteristica("¿La unidad tiene zonas verdes? (S/N): ", "s", "n");
                    salonSocial = verificarCaracteristica("¿La unidad tiene salón social? (S/N): ", "s", "n");
                    parque = verificarCaracteristica("¿La unidad tiene parque? (S/N): ", "s", "n");
                    vigilancia = verificarCaracteristica("¿La unidad tiene vigilancia? (S/N): ", "s", "n");
                    servicioDeAseo = verificarCaracteristica("¿La unidad tiene servicio de aseo? (S/N): ", "s", "n");
                    serviciosAdicionales = new ServiciosAdicionales(piscina, gimnasio, zonasVerdes, salonSocial, parque, vigilancia, servicioDeAseo);
                }

                estaUnidad = new Unidad(codigo, nombre, direccion, estrato, cerrada, serviciosAdicionales);

            }

            Apartamento esteApartamento = null;
            Casa estaCasa = null;

            boolean esApartamento = verificarCaracteristica("¿Esta propiedad es casa o apartamento? (C/A): ", "a", "c");

            if (esApartamento) {
                byte numeroDeTorre;
                do {
                    System.out.print("Ingrese el número de la torre en la que se encuentra el apartamento: ");
                    numeroDeTorre = entrada.nextByte();
                } while (numeroDeTorre < 1);

                estaTorre = buscarTorre(estaUnidad, numeroDeTorre);
                if (estaTorre == null) {
                    System.out.println("La torre " + numeroDeTorre + " no está registrada en esta unidad. Se procederá a registrarla");
                    System.out.println("El número que ingresó será el de esta nueva torre (" + numeroDeTorre + ").");
                    byte numeroPisos;
                    do {
                        System.out.print("Ingrese el número de pisos que tiene la torre: ");
                        numeroPisos = entrada.nextByte();
                    } while (numeroPisos < 1);
                    byte numeroAptosPorPiso;
                    do {
                        System.out.print("Ingrese el número de apartamentos por piso: ");
                        numeroAptosPorPiso = entrada.nextByte();
                    } while (numeroAptosPorPiso < 1);
                    boolean ascensor = verificarCaracteristica("¿Esta torre tiene ascensor? (S/N): ", "s", "n");
                    estaTorre = new Torre(numeroDeTorre, numeroPisos, numeroAptosPorPiso, ascensor, estaUnidad);
                    estaUnidad.agregarTorre(estaTorre);
                }
                
               
                //Recopilacion de info exclusiva para construir el apartamento
                System.out.print("Ingrese un código para el apartamento: A");
                String codigoApto;
                entrada = new Scanner(System.in);
                codigoApto = "A" + entrada.nextLine();
                while (buscarInmueble(codigoApto) != null) {
                    System.out.println("Ya hay un apartamento con el código " + codigoApto + ", si desea salir, escriba 'S' a continuación.");
                    System.out.print("Ingrese un código para este apartamento: A");
                    entrada =  new Scanner(System.in);
                    codigoApto = "A" + entrada.nextLine();
                    if (codigoApto.toLowerCase().equals("as")) {
                        return;
                    }
                }
                                
                esteApartamento = new Apartamento(codigoApto, false, estaTorre, esteClienteOferente);
                
                esteClienteOferente.anhadirInmueble(esteApartamento);                
                
                ingresarCaracteristicasComunes(esteApartamento);
                boolean parqueadero = verificarCaracteristica("¿Este apartamento tiene parqueadero? (S/N): ", "s", "n");
                esteApartamento.setParqueadero(parqueadero);
                ingresarRolYPrecios(esteApartamento);
                estaTorre.agregarApartamento(esteApartamento);
            } else {//Si es una casa

                //Recopilacion de info exclusiva para construir la casa
                System.out.print("Ingrese un código para la casa: C");
                String codigoCasa;
                entrada = new Scanner(System.in);
                codigoCasa = "C" + entrada.nextLine();
                while (buscarInmueble(codigoCasa) != null) {
                    System.out.println("Ya hay una casa con el código " + codigoCasa + ", si desea salir, escriba 'S' a continuación.");
                    System.out.print("Ingrese un código para esta casa: C");
                    entrada = new Scanner(System.in);
                    codigoCasa = "C" + entrada.nextLine();
                    if (codigoCasa.toLowerCase().equals("cs")) {
                        return;
                    }
                }
                byte numeroPisos;
                do {
                    System.out.print("Ingrese el número de pisos que tiene la casa: ");
                    numeroPisos = entrada.nextByte();
                } while (numeroPisos < 1);

                estaCasa = new Casa(codigoCasa, numeroPisos, estaUnidad, esteClienteOferente);
                esteClienteOferente.anhadirInmueble(estaCasa);
                ingresarCaracteristicasComunes(estaCasa);
                
                byte numeroDeGarajes;
                do {
                    System.out.print("Ingrese el número de garajes que tiene la casa: ");
                    numeroDeGarajes = entrada.nextByte();
                } while (numeroDeGarajes < 0);

                for (int i = 0; i < numeroDeGarajes; i++) {
                    estaCasa.anhadirGaraje(preguntarCaracteristicasGaraje(i + 1));
                }
                
                ingresarRolYPrecios(estaCasa);
                
                estaUnidad.agregarCasa(estaCasa);
            }//Ya se construyo el apto o la casa segun el caso.    
        }
        listaDeUnidades.add(estaUnidad);
    }

    private ClienteOferente elClienteEstaRegistradoComoOferente(long cedula) {
        for (int i = 0; i < listaDePersonas.size(); i++) {
            Persona estaPersona = listaDePersonas.get(i);
            if (estaPersona instanceof ClienteOferente) {
                if (cedula == estaPersona.getCedula()) {
                    return (ClienteOferente) estaPersona;
                }
            }
        }
        return null;
    }

    private Unidad buscarUnidad(int codigo) {
        for (int i = 0; i < listaDeUnidades.size(); i++) {
            Unidad estaUnidad = listaDeUnidades.get(i);
            if (codigo == estaUnidad.getCodigo()) {
                return estaUnidad;
            }
        }
        return null;
    }

    private Torre buscarTorre(Unidad unidad, byte numeroDeTorre) {
        LinkedList<Torre> listaDeTorres = unidad.getListaDeTorres();
        for (int i = 0; i < listaDeTorres.size(); i++) {
            Torre estaTorre = listaDeTorres.get(i);
            if (numeroDeTorre == estaTorre.getNumeroDeTorre()) {
                return estaTorre;
            }
        }
        return null;
    }

    private void ingresarCaracteristicasComunes(Inmueble inmueble) {

        int areaTotal;
        do {
            System.out.print("Ingrese el área total de esta propiedad (m2): ");
            entrada = new Scanner(System.in);
            areaTotal = entrada.nextInt();
        } while (areaTotal < 1);
        inmueble.setAreaTotal(areaTotal);

        boolean patio = verificarCaracteristica("¿Tiene patio? (S/N): ", "s", "n");
        inmueble.setPatio(patio);
        
        byte numeroDeBanhos;
        do {
            System.out.print("¿Cuántos baños tiene esta propiedad?: ");
            numeroDeBanhos = entrada.nextByte();
        } while (numeroDeBanhos < 0);

        for (int i = 0; i < numeroDeBanhos; i++) {
            inmueble.anhadirCuarto(preguntarCaracteristicasBanho(i + 1));
        }
        byte index = 1;
        while (verificarCaracteristica("¿Desea agregar la información de un espacio? (S/N): ", "s", "n")) {
            float area;
            
            System.out.print("¿Cuál es el uso del espacio " + index + "?: ");
            entrada = new Scanner(System.in);
            String uso = entrada.nextLine();
            do {
                System.out.print("¿Cuál es el área (en m2) del espacio " + index + "?: ");
                entrada = new Scanner(System.in);
                area = entrada.nextFloat();
            } while (area < 0);
            inmueble.anhadirCuarto(new Pieza(area, uso));
            index++;
        }     

    }
    
    private void ingresarRolYPrecios(Inmueble inmueble){
        byte rol;
        do {
            System.out.print("¿Esta propiedad estará en venta (1), arriendo (2), ambos (3), o desea asignarle un rol posteriormente (4)?: ");
            rol = entrada.nextByte();
        } while (rol < 1 || rol > 4);
        long precioDeVenta = 0;
        long tarifaDeArrendamiento = 0;
        switch (rol) {
            case 1:
                do {
                    System.out.print("Ingrese el precio de venta: $");
                    precioDeVenta = entrada.nextLong();
                } while (precioDeVenta < 0);
                break;
            case 2:
                do {
                    System.out.print("Ingrese la tarifa mensual de arrendamiento: $");
                    tarifaDeArrendamiento = entrada.nextLong();
                } while (tarifaDeArrendamiento < 0);
                break;
            case 3:
                do {
                    System.out.print("Ingrese el precio de venta: $");
                    precioDeVenta = entrada.nextLong();
                } while (precioDeVenta < 0);
                do {
                    System.out.print("Ingrese la tarifa mensual de arrendamiento: $");
                    tarifaDeArrendamiento = entrada.nextLong();
                } while (tarifaDeArrendamiento < 0);
                break;
            case 4:
                break;
        }
        inmueble.setRol(rol);
        inmueble.setPrecioDeVenta(precioDeVenta);
        inmueble.setTarifaDeArrendamiento(tarifaDeArrendamiento);
    }

    private Banho preguntarCaracteristicasBanho(int index) {
        float area;
        do {
            System.out.print("¿Cuál es el área (en m2) del baño " + index + "?: ");
            area = entrada.nextFloat();
        } while (area < 0);

        boolean banhera = verificarCaracteristica("¿El baño " + index + " tiene bañera? (S/N): ", "s", "n");
        boolean ducha = verificarCaracteristica("¿El baño " + index + " tiene ducha? (S/N): ", "s", "n");
        boolean enchapado = verificarCaracteristica("¿El baño " + index + " está enchapado? (S/N): ", "s", "n");
        boolean puertaDucha = verificarCaracteristica("¿La ducha del baño " + index + " tiene puerta? (S/N): ", "s", "n");

        return new Banho(area, banhera, ducha, enchapado, puertaDucha);
    }

    private Garaje preguntarCaracteristicasGaraje(int index) {
        float area;
        do {
            System.out.print("¿Cuál es el área (en m2) del garaje " + index + "?: ");
            area = entrada.nextFloat();
        } while (area < 0);

        float altura;
        do {
            System.out.print("¿Cuál es la altura del garaje " + index + "?: ");
            altura = entrada.nextFloat();
        } while (altura < 0);

        boolean puertaElectrica = verificarCaracteristica("¿El garaje " + index + " tiene puerta eléctrica? (S/N): ", "s", "n");

        return new Garaje(area, altura, puertaElectrica);
    }

    @Override
    public String toString() {
        return nombreParaMostrar;
    }
    
    @Override
    public String toStringParaMostrarElNivel() {
        return nombreParaMostrar.trim().concat("...................................................................").substring(0,67) + "Funcionarios";
    }

}
